/**
 * 麦克风SDK工具函数模块
 * 提供通用的辅助函数
 */

/**
 * 检测浏览器是否支持必要的API
 * @returns {Object} 支持状态对象
 */
export function checkBrowserSupport() {
  const support = {
    mediaDevices: !!navigator.mediaDevices,
    getUserMedia: !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia),
    audioContext: !!(window.AudioContext || window.webkitAudioContext),
    enumerateDevices: !!(navigator.mediaDevices && navigator.mediaDevices.enumerateDevices),
    audioWorklet: false,
    isSupported: false
  };
  
  // 检查AudioWorklet支持
  try {
    const tempContext = new (window.AudioContext || window.webkitAudioContext)();
    support.audioWorklet = !!tempContext.audioWorklet;
    tempContext.close().catch(e => console.warn('关闭临时音频上下文失败', e));
  } catch (e) {
    console.warn('检查AudioWorklet支持时出错', e);
  }
  
  // 判断整体是否支持
  support.isSupported = support.mediaDevices && support.getUserMedia && support.audioContext;
  
  return support;
}

/**
 * 检测是否在移动设备上运行
 * @returns {boolean} 是否是移动设备
 */
export function isMobileDevice() {
  return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
}

/**
 * 检测是否在UE5 Web UI环境中运行
 * @returns {boolean} 是否在UE5环境中
 */
export function isUE5Environment() {
  // 检查UE5特定的全局变量或URL参数
  return window.ue !== undefined || window.location.href.includes('ue5=true');
}

/**
 * 从URL获取调试模式状态
 * @returns {boolean} 是否启用调试模式
 */
export function isDebugMode() {
  const urlParams = new URLSearchParams(window.location.search);
  return urlParams.has('debug') && urlParams.get('debug') === 'true';
}

/**
 * 安全地解析JSON
 * @param {string} jsonString - JSON字符串
 * @param {*} defaultValue - 解析失败时的默认值
 * @returns {*} 解析结果或默认值
 */
export function safeJsonParse(jsonString, defaultValue = null) {
  try {
    return JSON.parse(jsonString);
  } catch (error) {
    console.warn('JSON解析失败:', error);
    return defaultValue;
  }
}

/**
 * 限制数值在指定范围内
 * @param {number} value - 输入值
 * @param {number} min - 最小值
 * @param {number} max - 最大值
 * @returns {number} 限制后的值
 */
export function clamp(value, min, max) {
  return Math.max(min, Math.min(max, value));
}

/**
 * 防抖函数
 * @param {Function} func - 要执行的函数
 * @param {number} wait - 等待时间(毫秒)
 * @returns {Function} 防抖处理后的函数
 */
export function debounce(func, wait = 300) {
  let timeout;
  return function(...args) {
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(this, args), wait);
  };
}

/**
 * 节流函数
 * @param {Function} func - 要执行的函数
 * @param {number} limit - 时间限制(毫秒)
 * @returns {Function} 节流处理后的函数
 */
export function throttle(func, limit = 300) {
  let inThrottle;
  return function(...args) {
    if (!inThrottle) {
      func.apply(this, args);
      inThrottle = true;
      setTimeout(() => inThrottle = false, limit);
    }
  };
}

/**
 * 生成唯一ID
 * @returns {string} 唯一ID
 */
export function generateUniqueId() {
  return Date.now().toString(36) + Math.random().toString(36).substr(2, 5);
}

/**
 * 格式化时间(秒)为MM:SS格式
 * @param {number} seconds - 秒数
 * @returns {string} 格式化后的时间
 */
export function formatTime(seconds) {
  const mins = Math.floor(seconds / 60);
  const secs = Math.floor(seconds % 60);
  return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
}

/**
 * 记录调试日志
 * @param {...any} args - 日志参数
 */
export function debugLog(...args) {
  if (isDebugMode()) {
    console.log('[MicrophoneSDK]', ...args);
  }
} 